#include "main_menu.h"
#include "function_select_menu.h"
#include "menu_config.h"
#include "../Drivers/BSP/RTC/bsp_rtc.h"

/* 添加全屏刷新标志位 */
static bool needFullRefresh = true;
/* 显示刷新标志，决定是否需要重绘菜单界面 */
static bool sg_needRefresh = true;

/* Main菜单项定义，现在只包含功能选择菜单 */
cotMenuList_t sg_MainMenuTable[] =
{
    COT_MENU_ITEM_BIND(TEXT_FUNCTION_SELECT, OnFunctionSelectMenuEnter, OnFunctionSelectMenuExit, LoadFunctionSelectMenu, NULL, "Function Select"),
};

/* 显示函数 - 显示RTC时钟 */
static void ShowMainMenu(cotMenuShow_t *ptShowInfo)
{
    /* 如果不需要刷新显示，直接返回 */
    if (!sg_needRefresh)
    {
        return;
    }

    /* 如果需要全屏刷新，则清屏并显示RTC时钟界面 */
    if (needFullRefresh)
    {
        /* 清屏 */
        lcd_clear(g_back_color);

        /* 显示标题，居中显示 */
        const char *pszTitle = get_text(TEXT_RTC_CLOCK);
        text_show_string_middle(0, 0, (char *)pszTitle, MENU_FONT_SIZE, lcddev.width, g_point_color);

        /* 在标题下方画一条横线 */
        lcd_draw_line(0, MENU_FONT_SIZE, lcddev.width - 1, MENU_FONT_SIZE, g_point_color);
        
        needFullRefresh = false;
    }

    /* 获取当前RTC时间 */
    rtc_get_time();
    
    /* 格式化时间字符串 */
    char timeStr[32];
    char dateStr[32];
    char weekStr[16];
    
    /* 格式化日期 */
    snprintf(dateStr, sizeof(dateStr), "%04d-%02d-%02d", calendar.year, calendar.month, calendar.date);
    
    /* 格式化时间 */
    snprintf(timeStr, sizeof(timeStr), "%02d:%02d:%02d", calendar.hour, calendar.min, calendar.sec);
    
    /* 格式化星期 - 使用language模块支持多语言 */
    TextId_e weekTextIds[] = {
        TEXT_WEEK_SUNDAY, TEXT_WEEK_MONDAY, TEXT_WEEK_TUESDAY, TEXT_WEEK_WEDNESDAY,
        TEXT_WEEK_THURSDAY, TEXT_WEEK_FRIDAY, TEXT_WEEK_SATURDAY
    };
    const char* weekText = get_text(weekTextIds[calendar.week]);
    snprintf(weekStr, sizeof(weekStr), "%s", weekText);
    
    /* 计算显示位置 */
    uint16_t centerY = lcddev.height / 2;
    uint16_t dateY = centerY - 60;   /* 日期显示位置 */
    uint16_t timeY = centerY - 20;   /* 时间显示位置 */
    uint16_t weekY = centerY + 20;   /* 星期显示位置 */
    
    /* 显示日期 */
    text_show_string_middle(0, dateY, dateStr, MENU_FONT_SIZE, lcddev.width, g_point_color);
    
    /* 显示时间 */
    text_show_string_middle(0, timeY, timeStr, MENU_FONT_SIZE, lcddev.width, g_point_color);
    
    /* 显示星期 */
    text_show_string_middle(0, weekY, weekStr, MENU_FONT_SIZE, lcddev.width, g_point_color);

    /* 清除刷新标志 */
    sg_needRefresh = false;
}

/* 按键回调函数 - 上键(KEY0) */
static void OnKey0FunCB(cotKey_t key)
{
    /* 在RTC时钟界面，上键用于刷新显示 */
    if (!cotKey_IsLongPress(key))
    {
        if (cotKey_IsTriggerWayMet(key, COT_KEY_TRIGGER_WAY_LOSSEN)) /* 识别到短按 */
        {
            sg_needRefresh = true; /* 刷新RTC时钟显示 */
        }
    }
}

/* 按键回调函数 - 下键(KEY1) */
static void OnKey1FunCB(cotKey_t key)
{
    /* 在RTC时钟界面，下键用于刷新显示 */
    if (!cotKey_IsLongPress(key))
    {
        if (cotKey_IsTriggerWayMet(key, COT_KEY_TRIGGER_WAY_LOSSEN)) /* 识别到短按 */
        {
            sg_needRefresh = true; /* 刷新RTC时钟显示 */
        }
    }
}

/* 按键回调函数 - 确认键(KEY2) - SET键 */
static void OnKey2FunCB(cotKey_t key)
{
    /* 处理按键短按和长按 */
    if (!cotKey_IsLongPress(key))
    {
        if (cotKey_IsTriggerWayMet(key, COT_KEY_TRIGGER_WAY_LOSSEN)) /* 识别到短按 */
        {
            /* SET键短按进入功能选择菜单 */
            cotMenu_Enter();
        }
    }
    else
    {
        if (cotKey_IsTriggerWayMet(key, COT_KEY_TRIGGER_WAY_PRESS)) /* 识别到长按 */
        {
            /* SET键长按刷新RTC时钟显示 */
            needFullRefresh = true;
            sg_needRefresh = true;
        }
    }
}

/* 进入回调函数 */
static void Hmi_EnterMainHmi(const cotMenuItemInfo_t *ptItemShowInfo)
{
    /* 绑定主菜单 */
    cotMenu_Bind(sg_MainMenuTable, COT_GET_MENU_NUM(sg_MainMenuTable), ShowMainMenu);
}

/* 加载回调函数 */
void Hmi_LoadMainHmi(const cotMenuItemInfo_t *ptItemShowInfo)
{
    /* 注册按键回调 */
    cotKey_Listen(KEY0, OnKey0FunCB);
    cotKey_Listen(KEY1, OnKey1FunCB);
    cotKey_Listen(KEY2, OnKey2FunCB);
    
    /* 配置按键模式 */
    cotKey_ConfigLongPressMode(KEY0, 1200, 400); /* 设置KEY0键长按模式，1.2秒长按，0.4秒重复 */
    cotKey_ConfigLongPressMode(KEY1, 1200, 400); /* 设置KEY1键长按模式，1.2秒长按，0.4秒重复 */
    cotKey_ConfigLongPressMode(KEY2, 2000, 0);   /* 设置KEY2键2秒长按，不重复触发 */
    
    /* 标记需要刷新且全屏刷新 */
    sg_needRefresh = true;
    needFullRefresh = true;
}

/* 任务回调函数 */
void Hmi_MainTask(const cotMenuItemInfo_t *ptItemShowInfo)
{
    /* RTC时钟界面定时刷新 - 每秒刷新一次 */
    static uint32_t lastRefreshTime = 0;
    uint32_t currentTime = HAL_GetTick();
    
    /* 每1000ms刷新一次RTC显示 */
    if (currentTime - lastRefreshTime >= 1000)
    {
        sg_needRefresh = true;
        lastRefreshTime = currentTime;
    }
}

/* 主菜单初始化 */
void MainMenu_Init(void)
{
    /* 设置系统语言 */
    set_language((SystemLanguage_e)g_tDisplayParam.language);

    /* 设置显示方向 */
    lcd_set_direction(g_tDisplayParam.direction);

    /* 重置所有按键为默认配置 */
    cotKey_ResetDefaultConfig(KEY0);
    cotKey_ResetDefaultConfig(KEY1);
    cotKey_ResetDefaultConfig(KEY2);

    /* 创建主菜单配置 */
    cotMainMenuCfg_t tMainMenu = COT_MENU_ITEM_BIND(TEXT_MAIN_MENU, Hmi_EnterMainHmi, NULL, Hmi_LoadMainHmi, Hmi_MainTask, NULL);

    /* 初始化菜单系统 */
    cotMenu_Init(&tMainMenu);
    
    /* 激活菜单系统 */
    cotMenu_MainEnter();

    /* 初始化显示变量 */
    sg_needRefresh = true;
}
